//
//  MCCommands.h
//  MCBLESDK
//  万机蓝牙SDK所有的库接口
//  Created by Jany on 2017/12/19.
//  Copyright © 2017年 MillionConcept. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MCBLEManager.h"

typedef enum : NSUInteger {
    MCType = 0,//采用mc的计算公式计算卡路里
    LEFType,//采用lef的计算公式计算卡路里
    BEUType,//采用beu的计算公式计算卡路里
} CalariCaculateTyte;

typedef enum : NSUInteger {
    MessageRemindNothing = 0,//不显示该界面，马达不震动，也不推送信息到设备
    MessageRemindDefault,//显示该界面，马达震动，推送 4 页: 信息类型+发信人+3 页信息内容，设备默认是该状态
    MessageRemindOther,//显示该界面，马达震动，只推送第一页: 信息类型+发信人
} MessageRemindType;//信息提醒及内容推送界面(设备不显示，意味着该功能关闭)

@interface MCCommands : NSObject

/**
 单例实例化

 @return 对象
 */
+ (instancetype)sharaCommands;

#pragma mark==================================SDK Method==================================
/**
 1.1    手机发送基准时间给设备:用户设定公/英制 12H/24H 制，经常 活动地,本地日期,本地时间给设备
 
 @param metric 公/英制
 @param timeZone 经常活动时区
 @param success 返回成功的数据 4Bytes DE+01+01+ED
 @param fail 返回失败
 */
- (void)sendBasicSetOfInformationData:(BOOL)metric
                 withActivityTimeZone:(NSInteger)timeZone
                              success:(void (^)(NSData *data))success
                                 fail:(void (^)(void))fail;

/**
 1.3    手机发送显示时间:本地(手机所在地)日期,时间,时区信息给设备

 @param date 本地时间
 @param success 返回成功4Bytes DE+01+02+ED
 @param fail 失败回调
 */
- (void)sendLocalTimeInformationData:(NSDate *)date
                             success:(void (^)(NSData *data))success
                                fail:(void (^)(void))fail;


/**
 1.5    手机发送用户基本参数: 体重,年龄,身高性别,步距给设备 性别,步距给设备---APP 在执行本指令前，需要先执行 1.3接口

 @param age 岁数
 @param weight 体重--公制对应的数据及单位:体重--Kg; 步距--cm; 距离--km 体重对应的最大值为:297Kg 只能发送公制单位的数据
 @param height 身高
 @param target 目标步数--目标步数对应的最大值为:20 万步
 @param sex 性别--性别: NO--女性; YES-男性
 @param step 步距--步距对应的最大值为:254cm (100inch)
 @param time 睡眠目标分
 @param success 返回成功4Bytes DE+01+03+ED
 @param fail 失败回调
 */
- (void)sendUserInformationBodyDataWithAge:(NSInteger)age
                                withWeight:(NSInteger)weight
                                    height:(NSInteger)height
                                       sex:(BOOL)sex
                                withTarget:(NSInteger)target
                              withStepAway:(NSInteger)step
                           withSleepTarget:(NSInteger)time
                                   success:(void (^)(NSData *data))success
                                      fail:(void (^)(void))fail;

/**
 1.7    手机请求设备发送公/英制,12H/24H 制,经常活动地时区,本地日期,本地时间

 @param success 返回成功16Bytes DE+01+01+FB...
 @param fail 失败回调
 */
- (void)sendRequestBasicSetOfInformationDataSuccess:(void (^)(NSData *data))success
                                               fail:(void (^)(void))fail;

/**
 1.9,   手机请求设备发送体重,生日,步距

 @param success 返回成功17Bytes DE+01+03+FB+...
 @param fail 失败回调
 */
- (void)sendLookBodyInformationDataWithUpdateSuccess:(void (^)(NSData *data))success
                                                fail:(void (^)(void))fail;

/**
 1.11,  手机发送用户选择黑/白屏,是否待机显示的信息到设备.注意此接口只针对W194,W286

 @param displayFlag 黑/白屏(1byte)00--白屏;01--黑屏
 @param waitingFlag 是否待机显示(1byte)00--可以待机显示; 01--不能待机显示
 @param success 返回成功4Bytes DE+01+04+ED
 @param fail 失败回调
 */
- (void)sendSetHardwareScreenDataWithDisplayFlag:(BOOL)displayFlag
                                     waitingFlag:(BOOL)waitingFlag
                                         success:(void (^)(NSData *data))success
                                            fail:(void (^)(void))fail;

/**
 1.13,  手机发送用户是/否需要数据隐私保护

 @param open 启用开关(1byte)
 @param password 4 位配对码(2byte)
 @param success 返回成功4Bytes DE+01+05+ED
 @param fail 失败回调
 */
- (void)sendPasswordProtectionDataWithOpen:(BOOL)open
                              withPassword:(NSString *)password
                                   success:(void (^)(NSData *data))success
                                      fail:(void (^)(void))fail;

/**
 1.15   手机请求设备的复位信息

 @param success 返回成功4Byte A5+01+00+FE+设备复位信息(2byte)
 @param fail 失败回调
 */
- (void)sendDeviceResetSignalSuccess:(void (^)(NSData *data))success
                                fail:(void (^)(void))fail;

/**
 1.17   手机发送设定睡眠，午休时间

 @param myFlag 开关控制,控制总的睡眠设置1/0 : 允许/禁止设备使用该功能自动进入，退出睡眠
 @param planSleepTime +计划睡眠小时(1byte)+计划睡眠分(1byte)
 @param openPlanSleepTimeFlag 是否打开开始睡眠
 @param remindSleepTime +睡眠提醒小时(1byte) +睡眠提醒分(1byte)
 @param remindSleepTimeFlag 是否开启睡眠提醒
 @param awakeTime +计划起床小时(1byte) +计划起床分(1byte)
 @param awakeTimeFlag 是否打开起床提醒
 @param noonSleepTime +计划午休小时(1byte) +计划午休分(1byte)
 @param noonSleepTimeFlag 是否开启午休提醒
 @param noonSleepOverTime +结束午休小时(1byte) +结束午休分(1byte)
 @param noonSleepOverTimeFlag 是否结束午休结束提醒
 @param noonSleepRemindTime +午休提醒小时(1byte) +午休提醒分(1byte)
 @param noonSleepRemindTimeFlag 是否开启午休提醒
 @param success 返回成功4Bytes DE+01+07+ED
 @param fail 失败回调
 */
- (void)setSleepTimeOpenFlag:(BOOL)myFlag
               planSleepTime:(NSDate *)planSleepTime openPlanSleepTimeFlag:(BOOL)openPlanSleepTimeFlag
             remindSleepTime:(NSDate *)remindSleepTime remindSleepTimeFlag:(BOOL)remindSleepTimeFlag
                   awakeTime:(NSDate *)awakeTime awakeTimeFlag:(BOOL)awakeTimeFlag
               noonSleepTime:(NSDate *)noonSleepTime noonSleepTimeFlag:(BOOL)noonSleepTimeFlag
           noonSleepOverTime:(NSDate *)noonSleepOverTime noonSleepOverTimeFlag:(BOOL)noonSleepOverTimeFlag
         noonSleepRemindTime:(NSDate *)noonSleepRemindTime noonSleepRemindTimeFlag:(BOOL)noonSleepRemindTimeFlag
                     success:(void (^)(NSData *data))success
                        fail:(void (^)(void))fail;
/**
 1.17-1 手机查询设备的睡眠时间，午休时间

 @param success 返回成功17Byte DE+01+07+FE+...
 @param fail 失败回调
 */
- (void)sendCheckDeviceSleepTimeSuccess:(void (^)(NSData *data))success
                                   fail:(void (^)(void))fail;

/**
 1.20   设备接收用户自定义的工作界面及免打扰功能后发送

 @param logoFlag 用户 logo 界面
 @param calorieFlag 卡路里界面
 @param sportDistance 运动距离界面
 @param sportTimeFlag 运动时间界面
 @param progressFlag 进度条界面
 @param faceFlag 表情界面
 @param alarmFlag 闹钟界面
 @param messageFlag 信息/未接来电界面
 @param callRemindFlag 来电提醒界面 (不显示此项将关闭该功能，用户将免打扰)
 @param messageRemindViewFlag 信息提醒及内容推送界面(设备不显示，意味着该功能关闭)
 @param messageRemindType 信息提醒界面(与 1D 相比，无内容推送界面)
 @param lifeTimeOverFlag 生命倒计时界面
 @param sportCountDownFlag 运动倒计时界面(w285s vivitar 增加的功能)
 @param success 返回成功4Bytes DE+01+08+ED
 @param fail 失败回调
 */
- (void)sendSetDistrubTheFunction:(BOOL)logoFlag
                      calorieFlag:(BOOL)calorieFlag
                    sportDistance:(BOOL)sportDistance
                    sportTimeFlag:(BOOL)sportTimeFlag
                     progressFlag:(BOOL)progressFlag
                         faceFlag:(BOOL)faceFlag
                        alarmFlag:(BOOL)alarmFlag
                      messageFlag:(BOOL)messageFlag
                   callRemindFlag:(BOOL)callRemindFlag
            messageRemindViewFlag:(BOOL)messageRemindViewFlag
                messageRemindType:(MessageRemindType)messageRemindType
                 lifeTimeOverFlag:(BOOL)lifeTimeOverFlag
               sportCountDownFlag:(BOOL)sportCountDownFlag
                          success:(void (^)(NSData *data))success
                             fail:(void (^)(void))fail;

/**
 1.19-1 手机查询设备的工作界面及免打扰功能

 @param success 返回成功20Bytes DE+01+08+FE+...
 @param fail 失败回调
 */
- (void)sendQueryDeviceInterfaceAndDoNotDistrubTheFunctionSuccess:(void (^)(NSData *data))success
                                                             fail:(void (^)(void))fail;

/**
 1.21   手机发送闹铃时间及使能

 @param dataArray 闹铃数据数组格式[{hour,@"Hour",minute,@"Minute",Bool,@"AlarmOpenState",Arr,@"AlarmRepeat"}] 数组里面每一个object都是一个字典，       字典的每一个key解释如下：Hour：数据小时（24小时制），Minute：数据分钟，AlarmOpenState：是否开启一个Bool值，AlarmRepeat：重复的星期（0-6即星期日到星期六,Arr的数据类型是NSNumber）
 @param success 返回成功4Bytes DE+01+09+ED
 @param fail 失败回调
 */
- (void)sendSetAlarmData:(NSArray <NSDictionary *>*)dataArray
                 success:(void (^)(NSData *data))success
                    fail:(void (^)(void))fail;

/**
 1.21-1 手机查询闹铃时间及使能

 @param success 返回成功20Bytes DE+01+09+FE+...
 @param fail 失败回调
 */
- (void)sendDeviceAlarmTimeAndUseFuctionSuccess:(void (^)(NSData *data))success
                                           fail:(void (^)(void))fail;

/**
 1.29,  手机发送用户佩戴方式信息
 
 @param right 左/右手
 @param success 返回成功4Byte DE+01+0B+ED
 @param fail 失败回调
 */
- (void)sendSetWearingWayDataWithRightHand:(BOOL)right
                                   success:(void (^)(NSData *data))success
                                      fail:(void (^)(void))fail;

/**
 1.31   手机发送事件信息到设备(久坐提醒)

 @param stateFlag 开关标志
 @param setTimeArrary 设置时间段 格式{startHour,@"startHour",startMinute,@"startMinute",endHour,@"endHour",endMinute,@"endMinute"}
 @param quietTime 静止时间
 @param success 返回成功4Bytes DE+01+0C+ED
 @param fail 失败回调
 */
- (void)sendSetDeviceSedentaryRemindOpenState:(BOOL)stateFlag
                                setTimeArrary:(NSArray<NSDictionary *>*)setTimeArrary
                                    quietTime:(NSInteger)quietTime
                                      success:(void (^)(NSData *data))success
                                         fail:(void (^)(void))fail;

/**
 1.31-1 手机查询久坐提醒

 @param success 返回成功19Bytes DE+01+0C+FE+...
 @param fail 失败回调
 */
- (void)sendDeviceSedentaryRemindSuccess:(void (^)(NSData *data))success
                                    fail:(void (^)(void))fail;

/**
 1.49,  手机发送自动测试心率的时间

 @param enable 开关控制
 @param time +早上开启心率小时(1byte)+ 早上开启心率分(1byte) +早上关闭心率小时(1byte)+ 早上关闭心率分(1byte) +中午开启   心率小时(1byte)+ 中午开启心率分(1byte) +中午关闭心率小时(1byte)+ 中午关闭心率分(1byte) +晚上开启心率小时(1byte)+ 晚上开启心率分(1byte) +晚上关闭心率小时(1byte)+ 晚上关闭心率分(1byte)
 @param success 返回成功4Byte DE+01+15+ED
 @param fail 失败回调
 */
- (void)sendAutoHRTest:(BOOL)enable
                  time:(NSArray<NSDictionary *> *)time
               success:(void (^)(NSData *data))success
                  fail:(void (^)(void))fail;

/**
 1.51-1 手机查询设备定时心率测试时间

 @param success 返回成功17Byte DE+01+15+FE+...
 @param fail 失败回调
 */
- (void)sendQuaryHeartRateMeasureTimeSuccess:(void (^)(NSData *data))success
                                        fail:(void (^)(void))fail;

/**
 2.1,   手机请求设备传输计步/睡眠数据(XX 日期 XX 时间点开始的数据)

 @param date 查询数据的开始时间 order 默为0
 @param success 返回成功 A.先按 2.3 将 XX 包数据发完。B.再发数据:4Byte DE+02+01+ED 备注:没有数据则跳过 2.2 A,B 步,直接发数据 DE+02+01+06(代表无数据)。
 @param fail 失败回调
 */
- (void)sendRequestHistorySportDataWithDate:(NSDate *)date
                                    success:(void (^)(NSData *data))success
                                       fail:(void (^)(void))fail;

/**
 2.4,   手机发送删除运动数据

 @param date 起始年(2Byte)+起始月(1Byte)+起始日(1Byte)
 @param success 返回成功 4Bytes DE+02+02+ED
 @param fail 失败回调
 */
- (void)sendDeleteSportDataWithDate:(NSDate *)date
                            success:(void (^)(NSData *data))success
                               fail:(void (^)(void))fail;

/**
 2.6,   手机请求设备开启实时传输数据-----APP 自动发送该指令

 @param success 返回成功 4Byte DE+02+03+ED
 @param fail 失败回调
 */
- (void)sendRealTimeGetDeviceDataSuccess:(void (^)(NSData *data))success
                                    fail:(void (^)(void))fail;

/**
 2.10,  手机请求设备传输历史数据的开始日期和结束日期

 @param success 返回成功 12Byte DE+02+05+FB+...
 @param fail 失败回调
 */
- (void)sendHistoricalDataStorageDateWithUpdateSuccess:(void (^)(NSData *data))success
                                                  fail:(void (^)(void))fail;

/**
 2.12   手机请求设备传输当天的数据--无日期要求---------该指令废弃，问题点：数据包不做校验；每一个index只返回一个数据，如果要求整天的数据得发48次，期间数据丢包处理比较麻烦

 @param index 数据序号(1byte)从 1 开始，1 表示第一个 30 分钟的数据，即从 0:00~0:30 共 6个5分钟的数据，依次类推。若数据序号(1byte)中 6 个 5 分钟的数据包，有些 5 分钟的数据包没有生 成时，则该 5 分钟的数据包补 0
 @param success 返回成功20Byte 02+06+...
 @param fail 失败回调
 */
- (void)requestDetailsAtIndex:(NSInteger)index
                      success:(void (^)(NSData *data))success
                         fail:(void (^)(void))fail;

/**
 3.9    手机请求设备关闭/开启设备功能,其他剩余的字节自动补齐

 @param cameraFlag bit0=1 设备开启拍照功能的界面,bit0=0 长按设备时,不会弹出拍照界面
 @param lockViewFlag bit1=1 有按键锁的界面,bit1=0 无按键锁的界面
 @param shakeFlag bit2=1 允许马达震动总开关,bit2=0 禁止马达震动总开关
 @param findViewFlag bit3=1 开启寻找手机功能的界面 bit3=0 关闭寻找手机功能的界面
 @param stepALGFlag bit4=1 启用高灵敏度计步算法(w311 当前计步算法)bit4=0 启用低灵敏度计步算法(w311v84 计步算法)
 @param musicViewFlag bit5=1 设备开启音乐功能的界面 bit5=0 长按设备时,不会弹出音乐界面
 @param blueControlViewFlag 当bit6=0设备无蓝牙开关界面时,设备都要自动开启蓝
 @param privacyFlag bit7=1 设备有隐私保护的功能和显示界面,bit7=0 设备无隐私保护的功能和显示界面
 @param haveBackViewFlag bit0=0，无二级返回界面,bit0=1，有二级返回界面
 @param HRShakeFlag bit1=0，心率 5/10 分钟不震动提醒
 @param callFlag 来电/信息无震动提醒
 @param HRFullFlag bit3=0，心率存储存满不提醒,bit3=1，心率存储存满提醒
 @param pinNumberFlag bit4=0，设备重启后无 6 位 pin 码 bit4=1，设备重启后有 6 位 pin 码
 @param calariShowFlag bit5=0，卡路里显示的 icon 是“心”bit5=1，卡路里显示的 icon 是“火”
 @param calariMeasureType bit7bit6=00，采用 mc 的计算公式计算卡路里,it7bit6=10，采用 lef 的计算公式计算卡路里,bit7bit6=01，采用 beu 的计算公式计算卡路里
 @param sleepFunctionFlag bit0=0，无睡眠界面和睡眠功能bit0=1,有睡眠界面和睡眠功能
 @param remindHaveIconFlag bit7=0，信息提醒界面无 icon,bit7=1，信息提醒界面增加相应的 icon
 @param success 返回成功4Byte DE+03+09 +ED
 @param fail 失败回调
 */
- (void)requestDeviceOpenOrCloseFunctionCameraFlag:(BOOL)cameraFlag//1Byte
                                      lockViewFlag:(BOOL)lockViewFlag
                                         shakeFlag:(BOOL)shakeFlag
                                      findViewFlag:(BOOL)findViewFlag
                                       stepALGFlag:(BOOL)stepALGFlag
                                     musicViewFlag:(BOOL)musicViewFlag
                               blueControlViewFlag:(BOOL)blueControlViewFlag
                                       privacyFlag:(BOOL)privacyFlag
                                  haveBackViewFlag:(BOOL)haveBackViewFlag//2Byte
                                       HRShakeFlag:(BOOL)HRShakeFlag
                                          callFlag:(BOOL)callFlag
                                        HRFullFlag:(BOOL)HRFullFlag
                                     pinNumberFlag:(BOOL)pinNumberFlag
                                    calariShowFlag:(BOOL)calariShowFlag
                                 calariMeasureType:(CalariCaculateTyte)calariMeasureType
                                 sleepFunctionFlag:(BOOL)sleepFunctionFlag//3Byte只在0位上做了操作
                                remindHaveIconFlag:(BOOL)remindHaveIconFlag//4Byte只在17位上做了操作
                                           success:(void (^)(NSData *data))success
                                              fail:(void (^)(void))fail;

/**
 3.19   手机强制手环充电

 @param success 返回成功4byte BE+03+10+ED
 @param fail 失败回调
 */
- (void)sendDeviceConstraintChargingSuccess:(void (^)(NSData *data))success
                                       fail:(void (^)(void))fail;

/**
 6.15   启动手机拍照功能(设备发给手机)
 
 @param state 打开状态
 @param success 返回成功4Bytes BE+06+07+ED
 @param fail 失败回调
 */
- (void)sendOpenCameraOrderState:(BOOL)state
                         success:(void(^)(NSData *data))success
                            fail:(void(^)(void))fail;

/**
 6.18   手机接收成功后此指令不用回调
 */
- (void)sendAnswerDeviceMusicFuction;

/**
 6.19   手机请求设备的版本信息

 @param success 返回成功20Bytes DE+06+09+FB+...
 @param fail 失败回调
 */
- (void)requestHardwareVirsionSuccess:(void (^)(NSData *data))success
                                 fail:(void (^)(void))fail;

/**
 6.23   手机请求设备启动 ANCS 功能(ios 手机专用)

 @param success 返回成功20Bytes BE+06+0B+ED
 @param fail 失败回调
 */
- (void)requestDeviceOpenANCSSuccess:(void (^)(NSData *data))success
                                fail:(void (^)(void))fail;

/**
 6.27   手机请求设备启动防丢功能

 @param success 返回成功4Byte DE+06+0D+ED
 @param fail 失败回调
 */
- (void)requestOpenLostFunctionSuccess:(void (^)(NSData *data))success
                                  fail:(void (^)(void))fail;

/**
 6.27   手机请求设备关闭防丢功能
 
 @param success 返回成功4Byte DE+06+0E+ED
 @param fail 失败回调
 */
- (void)requestCloseLostFunctionSuccess:(void (^)(NSData *data))success
                                   fail:(void (^)(void))fail;

/**
 6.31   手机请求设备震动马达

 @param success 返回成功4Byte DE+06+0F+ED
 @param fail 失败回调
 */
- (void)requestDeviceShakeSuccess:(void (^)(NSData *data))success
                             fail:(void (^)(void))fail;

/**
 6.34,手机收到报警指令后返回,此指令不需要回调

 */
- (void)sendReceiveDeviceAlarm;


/**
 6.35   手机向设备发送蓝牙广播的名字

 @param name 设备名字
 @param isBLE 类型开关(1byte)
 @param success 返回成功4Bytes DE+06+11+...
 @param fail 失败回调
 */
- (void)sendDeviceName:(NSString *)name
                 isBLE:(BOOL)isBLE
               success:(void (^)(NSData *data))success
                  fail:(void (^)(void))fail;

/**
 6.39   设备直接进入出厂模式

 @param success 返回成功4Bytes DE+06+30+ED
 @param fail 失败回调
 */
- (void)requestEnterFactoryModelSuccess:(void (^)(NSData *data))success
                                   fail:(void (^)(void))fail;


/**
 6.41   手机首次连接设备成功后，通知设备震动提醒并显示勾

 @param count 震动次数
 @param hook 是否打勾
 @param success 返回成功4Byte DE+06+31+ED
 @param fail 失败回调
 */
- (void)sendAlertWhenConnectShakeCount:(int)count
                                  hook:(BOOL)hook
                               success:(void (^)(NSData *data))success
                                  fail:(void (^)(void))fail;

/**
 7.1    手机发送特定指令和密码

 @param index 测试序号(1byte)
 @param success 返回成功9Bytes 86+00+01+02+FF+FA+FC+F7+...
 @param fail 失败回调
 */
- (void)sendPerpareRestDeviceAtIndex:(int)index
                             success:(void (^)(NSData *data))success
                                fail:(void (^)(void))fail;

/**
 7.3    手机再发送确认的数据到设备
 */
- (void)sendPerpareRestDeviceAgain;

/**
 7.10   手机告知设备，准备空中升级
 */
- (void)requestDeviceEnterOTA;

/**
 获取心率监测数据

 @param dData 4Byte
 */
- (void)getHeartRateMeasureData:(void(^)(NSInteger bpmValue))dData;

/**
 获取实时数据

 @param dData 历史数据前面两个包
 */
- (void)getRealTimeData:(void(^)(NSData *data))dData;
@end
